import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.*;

public class Test3 {
    //实验其他的数据链接方式
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Connection conn = null;
        Statement s = null;
        ResultSet r = null;
        try {
            //先创建数据库连接池，再通过连接池获取数据库连接对象
            DataSource ds =  new MysqlDataSource();
            //创建数据库连接池：初始化时，就会创建一定数量的数据库连接，这些连接对象是可以重复使用，效率更高
            //整个url带参数可以只使用setURL方法，也可以将参数调用方法的方式来设置
            ((MysqlDataSource) ds).setURL("jdbc:mysql://localhost:3306/java43");
            ((MysqlDataSource) ds).setUser("root");
            ((MysqlDataSource) ds).setPassword("123456");
            ((MysqlDataSource) ds).setUseUnicode(true);
            ((MysqlDataSource) ds).setCharacterEncoding("UTF-8");
            ((MysqlDataSource) ds).setUseSSL(false);
            conn = ds.getConnection();
            //先创建数据库连接池，在通过数据库连接池获取数据库连接对象。

            
            System.out.println(conn);
            //通过创建对象操作应用对象
            s = conn.createStatement();
            // （1）调用Statement操作命令对象的executeQuery(sql)
            // （2）返回一个ResultSet结果集对象（查询sql执行的结果集）
            r = s.executeQuery("select id,sn,name,qq_mail,classes_id from student where id = 3");
            //处理结果集:结果集可能是多行数据，需要遍历，调用next就移动到下一行，返回true代表该行有数据，返回false就代表该行没有数据
            while(r.next()){//一直遍历到最后没有数据
                int id = r.getInt("id");
                String sn = r.getString("sn");
                String name = r.getString("name");
                String qqMail = r.getString("qq_mail");
                int classesId = r.getInt("classes_id");
                System.out.printf("id=%s, sn=%s, name=%s, qqMail=%s, classesId=%s\n",
                        id, sn, name, qqMail, classesId);
            }
        }finally {
            //注意释放资源：
            //（1）无论什么情况都是需要释放的（异常）
            //（2）释放顺序和创建的顺序相反（结果集对象，操作命令对象，数据库连接对象）
            if(r != null)
                r.close();
            if(s != null)
                s.close();
            if (conn == null)
                conn.close();
        }
    }
}
